Hi Andrew,

> If you've done a later version of your DHCP patch, can you let me
> know? I sometimes get questions about DHCP, so I point people to you
> and your patch on nimbus.

Sure, I made a new version of the patch for bootp-2.4.2
which also integrates lots of comments I got on the previous
one :)

I will include the patch below...

Could you please add a remark that bootp-related questions
should be forwarded to the bootp-list, and not me?
Oh, and that the latest version of bootp can be found at
	firewall.mc.com:/pub

    Met vriendelijke groet,
        Pauline Middelink
+------------------------------+-------------------------------------+
| Jeanette Pauline Middelink   | email    : middelin@polyware.iaf.nl |
| Boterkorfhoek 34             | zakelijk : 053-780020               |
| 7546 JA  Enschede, Holland   | fax/data : 053-780021 (ook ISDN)    |
+------------------------------+-------------------------------------+
diff -rc bootp-2.4.2/Announce bootp-2.4.3/Announce
*** bootp-2.4.2/Announce	Thu Feb 16 21:18:17 1995
--- bootp-2.4.3/Announce	Thu Mar 16 08:58:23 1995
***************
*** 6,11 ****
--- 6,13 ----
  
  New features in version 2.4 include:
  
+ 	Added static DHCP allocation capabilities.
+ 		Use: :dl=leasetime for DHCP leasetime handouts
  	Added a simple BOOTP gateway program: bootpgw
  	Allow host name anywhere IP address is expected.
  	Automatically lookup the IP address when the name of a
***************
*** 49,60 ****
  	SunOS 4.X (Solaris 1.X)
  	SunOS 5.X (Solaris 2.X)
  	System V/386 Rel. 4.0
  
  Systems on which others say this code works:
  	CDC EP/IX (1.4.3, 2.1.1)
  	DEC Ultrix (4.2, 4.3)
- 	Linux 1.1.81
  	OSF/1 (DEC Alpha CPU)
  
  Please direct questions, comments, and bug reports to:
  	<bootp@andrew.cmu.edu>
--- 51,69 ----
  	SunOS 4.X (Solaris 1.X)
  	SunOS 5.X (Solaris 2.X)
  	System V/386 Rel. 4.0
+ 	Linux 1.1.81
  
  Systems on which others say this code works:
  	CDC EP/IX (1.4.3, 2.1.1)
  	DEC Ultrix (4.2, 4.3)
  	OSF/1 (DEC Alpha CPU)
+ 	HP 9000
+ 
+ How to get the latest version:
+ 	ftp firewall.mc.com (anonymous)
+ 	cd /pub
+ 	binary
+ 	get bootp-2.4.2.tar.Z
  
  Please direct questions, comments, and bug reports to:
  	<bootp@andrew.cmu.edu>
diff -rc bootp-2.4.2/Changes bootp-2.4.3/Changes
*** bootp-2.4.2/Changes	Thu Feb 16 17:52:06 1995
--- bootp-2.4.3/Changes	Thu Mar 16 08:24:18 1995
***************
*** 2,13 ****
--- 2,28 ----
  Date, <email> Real Name
  	what...
  
+ --> bootp-2.4.3
+ 
+ 08/07/95  middelin@polyware.iaf.nl (Pauline Middelink)
+ 	Fixed problem while reporting duplicate hardware address in
+ 	readfile.c (kerry@maine.maine.edu)
+ 	Changed some code to allow the giaddr to pass through. Needed
+ 	when the client request is forwarded to us through a gateway.
+ 	(Broadcasting to the gateway will not reach the client)
+ 	
+ 01/26/95  Phil.Packer@bbc.co.uk (Phil.Packer)
+ 	Added dl tag for DHCP lease and rejigged Pauline's codes
+ 	at the end of bootpd.c to allow the setting of explicit leases.
+ 	Added "sco" Makefile target.
+ 	
  --> bootp-2.4.2
  
  01/14/95  middelin@polyware.iaf.nl (Pauline Middelink)
  	Corrected support for the Linux networking code.
  	Fixed lots of warnings (gcc -Wall)
  	Added "linux" Makefile target.
+ 	Written code for DHCP static IP allocation.
  
  01/02/95  Jukka Ukkonen <ukkonen@csc.fi>
  	Allow bootptab syntax: ha="0:0:c0:80:e8:a7"
diff -rc bootp-2.4.2/Makefile bootp-2.4.3/Makefile
*** bootp-2.4.2/Makefile	Thu Feb 16 16:25:19 1995
--- bootp-2.4.3/Makefile	Thu Mar 16 08:52:30 1995
***************
*** 9,15 ****
  # OPTion DEFinitions:
  # Remove the -DVEND_CMU if you don't wish to support the "CMU vendor format"
  # in addition to the RFC1048 format.  Leaving out DEBUG saves little.
! OPTDEFS= -DSYSLOG -DVEND_CMU -DDEBUG
  
  # Uncomment and edit this to choose the facility code used for syslog.
  # LOG_FACILITY= "-DLOG_BOOTP=LOG_LOCAL2"
--- 9,16 ----
  # OPTion DEFinitions:
  # Remove the -DVEND_CMU if you don't wish to support the "CMU vendor format"
  # in addition to the RFC1048 format.  Leaving out DEBUG saves little.
! # Remove the -DDHCP if you don't need DHCP support.
! OPTDEFS= -DSYSLOG -DVEND_CMU -DDHCP -DDEBUG
  
  # Uncomment and edit this to choose the facility code used for syslog.
  # LOG_FACILITY= "-DLOG_BOOTP=LOG_LOCAL2"
***************
*** 37,43 ****
  
  INSTALL=/usr/bin/install
  DESTDIR=
! BINDIR=/usr/etc
  MANDIR=/usr/local/man
  
  CFLAGS= $(OPTDEFS) $(SYSDEFS) $(FILEDEFS) $(MOREDEFS)
--- 38,44 ----
  
  INSTALL=/usr/bin/install
  DESTDIR=
! BINDIR=/usr/sbin
  MANDIR=/usr/local/man
  
  CFLAGS= $(OPTDEFS) $(SYSDEFS) $(FILEDEFS) $(MOREDEFS)
***************
*** 95,103 ****
  		SYSDEFS="-DSVR4" \
  		SYSLIBS="-lsocket -lnsl"
  
! # Linux 1.1.80+ on [34]86
  linux:
! 	$(MAKE) SYSDEFS="-O6 -Wall -fomit-frame-pointer"
  
  # SunOS 4.X
  sunos4:
--- 96,111 ----
  		SYSDEFS="-DSVR4" \
  		SYSLIBS="-lsocket -lnsl"
  
! # Linux 1.1.80+
  linux:
! 	$(MAKE) SYSDEFS="-O6 -Wall -fomit-frame-pointer" \
! 		SYSLIBS="" \
! 		FILEDEFS='-DCONFIG_FILE=\"/etc/bootptab\" \
! 			  -DDUMPTAB_FILE=\"/tmp/bootpd.dump\"'
! 
! # SCO (pah!) SYSV rel 3.2
! sco:
! 	$(MAKE) CC="cc" SYSLIBS="-lsocket"
  
  # SunOS 4.X
  sunos4:
diff -rc bootp-2.4.2/bootp.h bootp-2.4.3/bootp.h
*** bootp-2.4.2/bootp.h	Mon Aug 22 18:49:17 1994
--- bootp-2.4.3/bootp.h	Thu Mar 16 08:17:22 1995
***************
*** 122,129 ****
  #define TAG_NIS_SERVER		((unsigned char)  41)
  #define TAG_NTP_SERVER		((unsigned char)  42)
  /* DHCP maximum message size. */
  #define TAG_MAX_MSGSZ		((unsigned char)  57)
! 
  /* XXX - Add new tags here */
  
  
--- 122,133 ----
  #define TAG_NIS_SERVER		((unsigned char)  41)
  #define TAG_NTP_SERVER		((unsigned char)  42)
  /* DHCP maximum message size. */
+ #define TAG_DHCP_IPLEASE	((unsigned char)  51)
+ #define TAG_DHCP_MSG	   	((unsigned char)  53)
+ #define TAG_DHCP_SERVERID	((unsigned char)  54)
  #define TAG_MAX_MSGSZ		((unsigned char)  57)
! #define TAG_DHCP_IPRENEW	((unsigned char)  58)	/* PeP hic facet */
! #define TAG_DHCP_IPREBIND	((unsigned char)  59)
  /* XXX - Add new tags here */
  
  
diff -rc bootp-2.4.2/bootpd.c bootp-2.4.3/bootpd.c
*** bootp-2.4.2/bootpd.c	Wed Feb 15 22:21:58 1995
--- bootp-2.4.3/bootpd.c	Thu Mar 16 08:31:12 1995
***************
*** 76,81 ****
--- 76,90 ----
  # define bzero(p,l)      memset(p,0,l)
  # define bcmp(a,b,c)     memcmp(a,b,c)
  #endif
+ #ifdef __linux__
+ /* Use sigaction to make signal last... */
+ inline void (*signal(int sig,void (*handler)(int)))(int) {
+ 	struct sigaction so,sa = {NULL,0,SA_NOMASK|SA_RESTART,NULL};
+ 	sa.sa_handler = handler;
+ 	if (sigaction(sig,&sa,&so)<0) return NULL;
+ 	return so.sa_handler;
+ }
+ #endif
  
  #include "bootp.h"
  #include "hash.h"
***************
*** 114,125 ****
  #ifdef VEND_CMU
  PRIVATE void dovend_cmu P((struct bootp *, struct host *));
  #endif
! PRIVATE void dovend_rfc1048 P((struct bootp *, struct host *, int32));
  PRIVATE void handle_reply P((void));
  PRIVATE void handle_request P((void));
  PRIVATE void sendreply P((int forward, int32 dest_override));
  PRIVATE void usage P((void));
  
  #undef	P
  
  /*
--- 123,144 ----
  #ifdef VEND_CMU
  PRIVATE void dovend_cmu P((struct bootp *, struct host *));
  #endif
! PRIVATE int  dovend_rfc1048 P((struct bootp *, struct host *, int32));
  PRIVATE void handle_reply P((void));
  PRIVATE void handle_request P((void));
  PRIVATE void sendreply P((int forward, int32 dest_override));
  PRIVATE void usage P((void));
  
+ #ifdef DHCP
+ PRIVATE int dhcp_discover P((struct bootp *, struct host *, byte *, int));
+ PRIVATE int dhcp_request P((struct bootp *, struct host *, byte *, int));
+ PRIVATE int dhcp_decline P((struct bootp *, struct host *, byte *, int));
+ PRIVATE int dhcp_release P((struct bootp *, struct host *, byte *, int));
+ PRIVATE int dhcp_offer P((struct bootp *, struct host *, byte *, int));
+ PRIVATE int dhcp_ack P((struct bootp *, struct host *, byte *, int));
+ PRIVATE int dhcp_lease P((struct bootp *, struct host *, byte **));
+ #endif
+ 
  #undef	P
  
  /*
***************
*** 477,482 ****
--- 496,512 ----
  		bootpc_port = (u_short) IPPORT_BOOTPC;
  	}
  
+ #ifdef DHCP
+ 	/*
+ 	 * Maybe we have to broadcast, so enable it.
+ 	 */
+ 	n = 1;
+ 	if (setsockopt(s,SOL_SOCKET,SO_BROADCAST,&n,sizeof(n))<0) {
+ 		report(LOG_ERR, "setsockopt: %s\n", get_errmsg());
+ 		exit(1);
+ 	}
+ #endif
+ 
  	/*
  	 * Set up signals to read or dump the table.
  	 */
***************
*** 701,707 ****
  					   haddrtoa(bp->bp_chaddr, bp->bp_hlen));
  			return; /* not found */
  		}
- 		(bp->bp_yiaddr).s_addr = hp->iaddr.s_addr;
  
  	} else {
  
--- 731,736 ----
***************
*** 724,729 ****
--- 753,759 ----
  			return;
  		}
  	}
+ 	(bp->bp_yiaddr).s_addr = hp->iaddr.s_addr;
  
  	if (debug) {
  		report(LOG_INFO, "found %s (%s)", inet_ntoa(hp->iaddr),
***************
*** 961,967 ****
  	 */
  	if (!bcmp(bp->bp_vend, vm_rfc1048, 4)) {
  		/* RFC1048 conformant bootp client */
! 		dovend_rfc1048(bp, hp, bootsize);
  		if (debug > 1) {
  			report(LOG_INFO, "sending reply (with RFC1048 options)");
  		}
--- 991,998 ----
  	 */
  	if (!bcmp(bp->bp_vend, vm_rfc1048, 4)) {
  		/* RFC1048 conformant bootp client */
! 		if (!dovend_rfc1048(bp, hp, bootsize))
! 			return;
  		if (debug > 1) {
  			report(LOG_INFO, "sending reply (with RFC1048 options)");
  		}
***************
*** 1093,1098 ****
--- 1124,1137 ----
  		/* Finally, set the server address field. */
  		bp->bp_siaddr = siaddr;
  	}
+ #ifdef DHCP
+ 	/*
+ 	 * This code is placed here, because otherwise the siaddr
+ 	 * will not be found...
+ 	 */
+ 	if (ntohs(bp->bp_flags) & 0x8000 && bp->bp_giaddr.s_addr==0)
+ 		dst.s_addr = INADDR_BROADCAST;
+ #endif
  	/* Set up socket address for send. */
  	send_addr.sin_family = AF_INET;
  	send_addr.sin_port = htons(port);
***************
*** 1220,1228 ****
  	if (bytesleft < (LEN)) { \
  		report(LOG_NOTICE, noroom, \
  			   hp->hostname->string, MSG); \
! 		return; \
  	} while (0)
! PRIVATE void
  dovend_rfc1048(bp, hp, bootsize)
  	struct bootp *bp;
  	struct host *hp;
--- 1259,1267 ----
  	if (bytesleft < (LEN)) { \
  		report(LOG_NOTICE, noroom, \
  			   hp->hostname->string, MSG); \
! 		return 0; \
  	} while (0)
! PRIVATE int
  dovend_rfc1048(bp, hp, bootsize)
  	struct bootp *bp;
  	struct host *hp;
***************
*** 1230,1235 ****
--- 1269,1278 ----
  {
  	int bytesleft, len;
  	byte *vp;
+ #ifdef DHCP
+ 	int dhcp = 0;
+ 	int isme = TRUE;	/* DHCP uses this for not-mine-requests */
+ #endif
  
  	static char noroom[] = "%s: No room for \"%s\" option";
  
***************
*** 1280,1286 ****
  				case TAG_SUBNET_MASK:
  					/* XXX - Should preserve this if given... */
  					break;
! 				} /* swtich */
  				p += len;
  			}
  
--- 1323,1335 ----
  				case TAG_SUBNET_MASK:
  					/* XXX - Should preserve this if given... */
  					break;
! 				case TAG_DHCP_MSG:
! 					dhcp = *p;
! 					break;
! 				case TAG_DHCP_SERVERID:
! 					isme = (len==4) && my_ip_addr.s_addr == ((struct in_addr *)p)->s_addr;
! 					break;
! 				} /* switch */
  				p += len;
  			}
  
***************
*** 1347,1362 ****
  		vp += len;
  		*vp++ = TAG_END;
  		bytesleft -= len + 3;
! 		return;					/* no more options here. */
  	}
  	/*
! 	 * The remaining options are inserted by the following
! 	 * function (which is shared with bootpef.c).
! 	 * Keep back one byte for the TAG_END.
  	 */
! 	len = dovend_rfc1497(hp, vp, bytesleft - 1);
! 	vp += len;
! 	bytesleft -= len;
  
  	/* There should be at least one byte left. */
  	NEED(1, "(end)");
--- 1396,1439 ----
  		vp += len;
  		*vp++ = TAG_END;
  		bytesleft -= len + 3;
! 		return 1;				/* no more options here. */
  	}
+ 
+ #ifdef DHCP
  	/*
! 	 * Check if this is a DHCP request.
  	 */
! 	if (dhcp!=0) {
! 		if (!isme)
! 			return 0;	/* Not mine, discard! */
! 
! 		switch (dhcp) {
! 		 case 1 : len = dhcp_discover(bp,hp,vp,bytesleft-1); break;
! 		 case 3 : len = dhcp_request(bp,hp,vp,bytesleft-1); break;
! 		 case 4 : len = dhcp_decline(bp,hp,vp,bytesleft-1); break;
! 		 case 7 : len = dhcp_release(bp,hp,vp,bytesleft-1); break;
! 		 default : report(LOG_NOTICE,"Unknown DHCP request (%d)",dhcp);
! 			   return 0;
! 		}
! 		/* Is there a DHCP reply at all? */
! 		if (len==0)
! 			return 0;
! 		vp += len;
! 		bytesleft -= len;
! 	}
! 	else {
! #endif
! 		/*
! 		 * The remaining options are inserted by the following
! 		 * function (which is shared with bootpef.c).
! 		 * Keep back one byte for the TAG_END.
! 		 */
! 		len = dovend_rfc1497(hp, vp, bytesleft - 1);
! 		vp += len;
! 		bytesleft -= len;
! #ifdef DHCP
! 	}
! #endif
  
  	/* There should be at least one byte left. */
  	NEED(1, "(end)");
***************
*** 1370,1375 ****
--- 1447,1453 ----
  		 */
  		bzero(vp, bytesleft);
  	}
+ 	return 1;	/* sent reply */
  } /* dovend_rfc1048 */
  #undef	NEED
  
***************
*** 1389,1394 ****
--- 1467,1637 ----
   */
  
  /* get_errmsg() - now in report.c */
+ 
+ 
+ #ifdef DHCP
+ 
+ /*
+  * PeP hic facet
+  * Stuff the packet with the Lease info, We need to do this on the Offer and
+  * the ack so separated out here
+  */
+ PRIVATE
+ int dhcp_lease(bp, hp, vp)
+     struct bootp *bp;
+     struct host *hp;
+     byte **vp;
+ {
+ 	*(*vp)++ = TAG_DHCP_IPRENEW;	/* DHCP Renewal time 50% of lease */
+ 	*(*vp)++ = 4;			/* Length */
+ 	insert_u_long(htonl(hp->dhcp_lease/2),vp);
+ 
+ 	*(*vp)++ = TAG_DHCP_IPREBIND;	/* DHCP Rebinding time 85% of lease */
+ 	*(*vp)++ = 4;
+ 	insert_u_long(htonl(hp->dhcp_lease*7/8),vp);
+ 	
+ 	*(*vp)++ = TAG_DHCP_IPLEASE;	/* IP address lease time */
+ 	*(*vp)++ = 4;			/* Length */
+ 	insert_u_long(htonl(hp->dhcp_lease),vp); /* PeP hic facet, lets see if this works */
+ 
+ 	return(19);
+ }
+ 
+ 
+ /*
+  * Formulate an DHCP_DISCOVER reply
+  */
+ PRIVATE
+ int dhcp_discover(bp, hp, vp, bytesleft)
+     struct bootp *bp;
+     struct host *hp;
+     byte *vp;
+     int bytesleft;
+ {
+ 	if(debug)
+ 		report(LOG_INFO, "Received: DHCPDISCOVER");
+ 	return(dhcp_offer(bp,hp,vp,bytesleft));
+ }
+ 
+ /*
+  * formulate an DHCP_RELEASE reply
+  */
+ PRIVATE
+ int dhcp_release(bp, hp, vp, bytesleft)
+     struct bootp *bp;
+     struct host *hp;
+     byte *vp;
+     int bytesleft;
+ {
+ 	if (debug)
+ 		report(LOG_INFO, "Received: DHCPRELEASE (discarded)");
+ 	return 0;
+ }
+ 
+ PRIVATE
+ int dhcp_offer(bp, hp, vp, bytesleft)
+     struct bootp *bp;
+     struct host *hp;
+     byte *vp;
+     int bytesleft;
+ {
+ 	int len=0;
+ 	if (debug)
+ 		report(LOG_INFO, "Sent: DHCPOFFER");
+ 
+ 	bp->bp_secs = bp->bp_hops = 0;
+ 	bp->bp_ciaddr.s_addr = 0;
+ 
+ 	*vp++ = TAG_DHCP_MSG;		/* DHCP */
+ 	*vp++ = 1;			/* length */
+ 	*vp++ = 2;			/* DHCPOFFER */
+ 	len +=  3;	
+ 
+ 	len += dhcp_lease(bp,hp,&vp);
+ 
+ 	*vp++ = TAG_DHCP_SERVERID;
+ 	*vp++ = 4;
+ 	insert_u_long(my_ip_addr.s_addr,&vp);
+ 	len += 6;
+ 
+ 	return len + dovend_rfc1497(hp, vp, bytesleft - len);
+ }
+ 
+ /*
+  * Formulate an DHCP_REQUEST reply
+  */
+ PRIVATE
+ int dhcp_request(bp, hp, vp, bytesleft)
+     struct bootp *bp;
+     struct host *hp;
+     byte *vp;
+     int bytesleft;
+ {
+ 	bp->bp_secs = bp->bp_hops = 0;
+ 
+ 	if(debug)
+ 		report(LOG_INFO,"Received: DHCPREQUEST");
+ 	/*
+ 	 * Make absolutely sure that if the client requests an address,
+ 	 * it is its own address, and also make sure the hardware
+ 	 * addresses match perfectly. We want to minimize spoofing!
+ 	 */
+ 	if ((bp->bp_ciaddr.s_addr && bp->bp_ciaddr.s_addr!=bp->bp_yiaddr.s_addr) ||
+ 	    bp->bp_htype != hp->htype ||
+             bcmp(bp->bp_chaddr, hp->haddr, haddrlength(hp->htype))) {
+ 		if (debug)
+ 			report(LOG_INFO, "Sent: DHCPNAK");
+ 
+ 		*vp++ = TAG_DHCP_MSG;	/* DHCPNAK */
+ 		*vp++ = 1;
+ 		*vp++ = 6;
+ 		return 3;
+ 	}
+ 	else 
+ 		return(dhcp_ack(bp,hp,vp,bytesleft));	
+ }
+ 
+ PRIVATE
+ int dhcp_ack(bp, hp, vp, bytesleft)
+     struct bootp *bp;
+     struct host *hp;
+     byte *vp;
+     int bytesleft;
+ {
+ 	int len=0;
+ 	if (debug)
+ 		report(LOG_INFO, "Sent: DHCPACK");
+ 
+ 	*vp++ = TAG_DHCP_MSG;	/* DHCPACK */
+ 	*vp++ = 1;
+ 	*vp++ = 5;
+ 	len += 3;
+ 
+ 	len += dhcp_lease(bp,hp,&vp);
+ 
+ 	*vp++ = TAG_DHCP_SERVERID;	/* Server id */
+ 	*vp++ = 4;
+ 	insert_u_long(my_ip_addr.s_addr,&vp);
+ 	len += 6;
+ 
+ 	return len + dovend_rfc1497(hp, vp, bytesleft - len);
+ }
+ 
+ /*
+  * formulate an DHCP_DECLINE reply
+  */
+ PRIVATE
+ int dhcp_decline(bp, hp, vp, bytesleft)
+     struct bootp *bp;
+     struct host *hp;
+     byte *vp;
+     int bytesleft;
+ {
+ 	if (debug)
+ 		report(LOG_INFO, "Recived: DHCPDECLINE (ignored)");
+ 	return 0;
+ }
+ #endif
  
  /*
   * Local Variables:
diff -rc bootp-2.4.2/bootpd.h bootp-2.4.3/bootpd.h
*** bootp-2.4.2/bootpd.h	Thu Jul 28 00:30:29 1994
--- bootp-2.4.3/bootpd.h	Thu Mar 16 08:17:23 1995
***************
*** 126,131 ****
--- 126,134 ----
  		exec_file	:1,
  		msg_size	:1,
  		min_wait	:1,
+ #ifdef DHCP
+ 		dhcp_lease	:1,	/* PeP hic facet */
+ #endif
  		/* XXX - Add new tags here */
  		vm_cookie	:1;
  };
***************
*** 184,189 ****
--- 187,195 ----
      unsigned int32	    bootsize,
  			    msg_size,
  			    min_wait;
+ #ifdef DHCP
+     unsigned int32	    dhcp_lease; /* PeP hic facet */
+ #endif
      struct in_addr	    bootserver,
  			    iaddr,
  			    swap_server,
diff -rc bootp-2.4.2/bootptest.c bootp-2.4.3/bootptest.c
*** bootp-2.4.2/bootptest.c	Thu Feb 16 16:36:25 1995
--- bootp-2.4.3/bootptest.c	Thu Mar 16 08:17:36 1995
***************
*** 50,55 ****
--- 50,58 ----
  #include <unistd.h>
  #endif
  
+ #ifndef	NO_UNISTD
+ #include <unistd.h>
+ #endif
  #include <stdlib.h>
  #include <signal.h>
  #include <stdio.h>
***************
*** 66,71 ****
--- 69,77 ----
  
  #include "patchlevel.h"
  
+ static void send_request();
+ 
+ extern int getether();
  static void send_request();
  
  #define LOG_ERR 1
diff -rc bootp-2.4.2/patchlevel.h bootp-2.4.3/patchlevel.h
*** bootp-2.4.2/patchlevel.h	Thu Feb 16 16:42:20 1995
--- bootp-2.4.3/patchlevel.h	Thu Mar 16 08:24:26 1995
***************
*** 1,3 ****
  /* patchlevel.h */
  #define VERSION 	"2.4"
! #define PATCHLEVEL	2
--- 1,3 ----
  /* patchlevel.h */
  #define VERSION 	"2.4"
! #define PATCHLEVEL	3
diff -rc bootp-2.4.2/print-bootp.c bootp-2.4.3/print-bootp.c
*** bootp-2.4.2/print-bootp.c	Wed Feb 15 23:21:13 1995
--- bootp-2.4.3/print-bootp.c	Thu Mar 16 08:41:15 1995
***************
*** 268,274 ****
  	"iXW-FS",			/* 48: X Window System Font Servers */
  	"iXW-DM",			/* 49: X Window System Display Managers */
  
! 	/* DHCP extensions (RFC-1533, sect. 9) */
  #endif
  };
  #define	KNOWN_OPTIONS (sizeof(rfc1048_opts) / sizeof(rfc1048_opts[0]))
--- 268,279 ----
  	"iXW-FS",			/* 48: X Window System Font Servers */
  	"iXW-DM",			/* 49: X Window System Display Managers */
  
! 	/* DHCP extensions (RFC-1533, sect. 9) PeP hic facet */
! 	"iDHCPreq",			/* 50: DHCP requested IP address */
! 	"lDHCPlease",			/* 51: DHCP lease time */ 
! 	"bDHCPooptol",			/* 52: DHCP option overload */
! 	"bDHCPtype",			/* 53: DHCP message type */
! 	"iDHCPSid",			/* 54: DHCP server ID */
  #endif
  };
  #define	KNOWN_OPTIONS (sizeof(rfc1048_opts) / sizeof(rfc1048_opts[0]))
diff -rc bootp-2.4.2/readfile.c bootp-2.4.3/readfile.c
*** bootp-2.4.2/readfile.c	Wed Feb 15 21:45:25 1995
--- bootp-2.4.3/readfile.c	Thu Mar 16 08:46:17 1995
***************
*** 113,118 ****
--- 113,121 ----
  #define SYM_EXEC_FILE		 33	/* YORK_EX_OPTION */
  #define SYM_MSG_SIZE 		 34
  #define SYM_MIN_WAIT		 35
+ #define SYM_DHCP_LEASE		 36	/* RFC 1533 PeP hic facet */
+ #define SYM_DHCP_IPRENEW	 37
+ #define SYM_DHCP_IPREBIND	 38
  /* XXX - Add new tags here */
  
  #define OP_ADDITION		  1	/* Operations on tags */
***************
*** 161,166 ****
--- 164,172 ----
  	{"df", SYM_DUMP_FILE},
  	{"dn", SYM_DOMAIN_NAME},
  	{"ds", SYM_DOMAIN_SERVER},
+ #ifdef DHCP
+ 	{"dl", SYM_DHCP_LEASE},		/* PeP hic facet */
+ #endif
  	{"ef", SYM_EXTEN_FILE},
  	{"ex", SYM_EXEC_FILE},		/* YORK_EX_OPTION */
  	{"gw", SYM_GATEWAY},
***************
*** 1125,1131 ****
  		PARSE_UINT(min_wait);
  		break;
  
! 		/* XXX - Add new tags here */
  
  	default:
  		return E_UNKNOWN_SYMBOL;
--- 1131,1146 ----
  		PARSE_UINT(min_wait);
  		break;
  
! #ifdef DHCP		
! 	/* PeP hic facet. */			
! 	case SYM_DHCP_LEASE:
! 		PARSE_UINT(dhcp_lease);
! 		break;
! 
! 		/* XXX - Add new DHCP tags here */
! #endif
! 
! 	/* XXX - Add new tags here */
  
  	default:
  		return E_UNKNOWN_SYMBOL;
***************
*** 1506,1511 ****
--- 1521,1527 ----
  	DUP_COPY(min_wait);
  
  	/* XXX - Add new tags here */
+ 	DUP_COPY(dhcp_lease); /* PeP hic facet */
  
  	DUP_LINK(generic);
  

